/**
 * @file system_clock_config.c
 * @brief 系统时钟配置实现文件
 * @version 1.0
 * @date 2025-03-15
 * @author Ye_Huai
 * @copyright Copyright (c) 2025 Ye_Huai
 * @brief 本文件实现了系统时钟配置为 72MHz 的功能，使用外部高速晶振（HSE）作为时钟源
 */

#include "system_clock_config.h"

/**
 * @brief 配置系统时钟为 72MHz
 * @details 该函数将系统时钟配置为 72MHz，使用外部高速晶振（HSE）作为时钟源
 *          配置步骤如下：
 *          1. 使能 HSE
 *          2. 等待 HSE 稳定
 *          3. 配置 PLL 时钟源和倍频系数
 *          4. 使能 PLL
 *          5. 等待 PLL 稳定
 *          6. 选择 PLL 作为系统时钟源
 *          7. 等待系统时钟源切换完成
 */
void SystemClock_Config(void)
{
    ErrorStatus HSEStartUpStatus;

    // 使能外部高速时钟（HSE）
    RCC_HSEConfig(RCC_HSE_ON);

     // 等待HSE启动并稳定，将启动状态存储在HSEStartUpStatus中
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

	 // 检查HSE是否成功启动
    if (HSEStartUpStatus == SUCCESS)
    {
        // 使能FLASH预取缓冲区，提高指令读取速度
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
		// 设置FLASH等待状态为2个时钟周期
        FLASH_SetLatency(FLASH_Latency_2);

        // 配置AHB总线时钟（HCLK），使其等于系统时钟（SYSCLK）
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        // 配置APB2总线时钟（PCLK2），使其等于AHB总线时钟（HCLK）
        RCC_PCLK2Config(RCC_HCLK_Div1);

        // 配置APB1总线时钟（PCLK1），使其为AHB总线时钟（HCLK）的一半
        RCC_PCLK1Config(RCC_HCLK_Div2);

        // 配置 PLL 时钟源和倍频系数
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

        // 使能 PLL
        RCC_PLLCmd(ENABLE);

        // 等待 PLL 稳定
        while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

        // 选择 PLL 作为系统时钟源
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

        // 等待系统时钟源切换完成
        while (RCC_GetSYSCLKSource() != 0x08);
    }
}
